3D Forward Modelling of Gravity & Magnetic Fields¶
Table of Contents¶
- Introduction
- Mitigating Technology Failure Risk in Geophysical Projects: Proof of Concept with Theoretical 3D Forward Models
- Mitigating Exploration Risks with 3D Modeling in mineral Resource Projects
- Field Survey Planning
- QA/QC and Field Data Validation
- Understanding & Interpretation of Magnetic & Gravity Data
- Inversion Process and Computational Cost
- Generating Calculated Data through Inversion
- Constructing Initial Models with Apriori Information
Introduction¶
3D forward modeling of gravity and magnetic fields is a geophysical technique used to predict the gravitational and magnetic response of subsurface structures based on an assumed geological model. This process helps in simulating how the Earth's subsurface features would behave under various field conditions and is fundamental for understanding subsurface geology. By comparing the forward model's predicted data with actual field data, geophysicists can iteratively refine their model to improve accuracy in resource exploration.
Mitigating Technology Failure Risk in Geophysical Projects: Proof of Concept with Theoretical 3D Forward Models¶
Before undertaking a full-scale geophysical survey, there is always a risk that the chosen technology (such as gravity or magnetic methods) may not accurately identify the mineral resources in the target area. This is a significant concern, as geophysical surveys involve high costs for both equipment and specialized software, making the decision to invest in these technologies critical.
To reduce this risk, companies can conduct preliminary studies by collecting rock samples from the survey area and measuring their physical properties, such as magnetic susceptibility or density. Using these physical properties, a theoretical model can be developed to predict the expected gravity and magnetic field responses in the area.
This 3D forward modeling, based on actual data from rock samples, acts as a proof of concept for the geophysical methods under consideration. By simulating the survey results in advance, companies can evaluate whether the chosen method is likely to detect the targeted resources. This helps de-risk the project by ensuring that the investment in expensive surveys is only made if the theoretical models show promising results.
Ultimately, this process allows companies to focus their investment on geophysical technologies that have a high probability of success, based on data-driven insights from the theoretical models, rather than taking unnecessary financial risks with unproven methods.
Mitigating Exploration Risks with 3D Modeling in Mineral Resource Projects¶
In the later phases of a mineral exploration project, once a few exploratory drill holes have been completed, the physical properties obtained from the samples collected can be utilized to construct an initial 3D model. This model can then be aligned with field measurements through an inversion process, allowing for a more accurate representation of the subsurface geology.
This method enables companies to assess key resource parameters, such as the quantity and quality of the resource, at an early stage of detailed exploration. By leveraging this approach, the risk of an entire exploration project failing is significantly reduced. Given that drilling is an expensive undertaking, any negative valuation derived from models prepared after drilling can lead to substantial financial losses.
In industries like mining, oil & gas, or geothermal energy, investors typically demand proof of concept before committing significant capital. Here, 3D forward modeling proves to be an invaluable tool. By simulating subsurface geological formations, the model can predict how these formations might impact geophysical measurements—such as gravity or magnetic fields.
With this preliminary insight, companies can present a compelling case for the potential success of a geophysical project to investors. The model can demonstrate whether specific geological structures are likely to harbor valuable resources, thus providing stakeholders with greater confidence in the project's technical feasibility. This process, anchored in scientific data and predictive simulations, significantly de-risks investment decisions and offers a robust, data-driven foundation to justify the substantial financial commitments associated with large-scale exploration projects.
Field Survey Planning¶
Before conducting expensive and time-consuming field surveys, 3D forward modeling helps geophysicists plan the most effective survey designs. By simulating expected gravity and magnetic responses, forward models can inform decisions about:
- Optimal survey grid spacing,
- Necessary instrumentation,
- Key areas of interest.
By using forward modeling, geophysicists can focus their resources on the most promising exploration zones, reducing unnecessary costs and increasing the chances of successful detection of subsurface anomalies.
QA/QC and Field Data Validation¶
Once field data is collected, it's essential to validate the data for accuracy and consistency. 3D forward modeling aids in quality assurance (QA) and quality control (QC) processes by providing a benchmark for comparison. If the observed data significantly deviates from the forward model's predictions, it may indicate errors in data acquisition or suggest that further calibration is needed. Forward modeling allows geophysicists to:
- Validate field data against synthetic data,
- Detect noise or anomalies that may compromise data integrity,
- Ensure that the data collected reflects realistic subsurface conditions.
This process is critical in ensuring the reliability of the data, which forms the basis for all subsequent exploration decisions.
Understanding & Interpretation of Magnetic & Gravity Data¶
Magnetic and gravity data can be complex and challenging to interpret due to the non-unique nature of geophysical inversion processes. Forward modeling assists in understanding how subsurface bodies generate these data signals, serving as a valuable interpretation tool. By creating synthetic models, geophysicists can compare observed data with predictions to better interpret:
- Depth and shape of geological bodies,
- Types of materials present (e.g., magnetic ore bodies, salt domes),
- Potential faults or structural deformations.
Given the complexities of inversion processes, forward modeling helps in gaining initial insights before undertaking more computationally demanding inversion techniques.
Inversion Process and Computational Cost¶
The inversion process involves converting field data (gravity or magnetic) into a 3D model of subsurface properties. However, inversion techniques are computationally expensive due to the iterative nature of refining the model to fit the observed data. Forward modeling plays a crucial role in reducing this computational burden. By using forward models as a starting point, the number of iterations required for the inversion process can be minimized, thereby reducing computation time and costs.
In this sense, forward modeling is an essential precursor to inversion because it provides a first approximation of the subsurface, guiding the inversion process more efficiently.
Generating Calculated Data through Inversion¶
Inversion techniques use forward modeling results as a basis to iteratively refine the model to generate calculated data that matches the observed field data. In essence, the goal is to minimize the difference between the field data and the model predictions. In the process of inversion:
- Forward models predict the expected magnetic or gravity response.
- These predictions are compared to real-world observations.
- The inversion algorithm updates the model parameters to reduce the mismatch.
This iterative loop between forward and inversion modeling helps create an accurate representation of the subsurface, leading to better decision-making in exploration.
Constructing Initial Models with Apriori Information¶
One of the most effective ways to enhance the accuracy of inversion processes is to start with an initial model based on apriori information. Apriori information refers to data that is already known about the subsurface, such as geological maps, borehole logs, or previous geophysical surveys. By incorporating this information into the forward model:
- Geophysicists can create more realistic initial models,
- The inversion process becomes more efficient, with fewer iterations required to fit the data,
- The final model is more likely to reflect the true geological conditions.
Starting with an informed model helps reduce ambiguity and enhances the overall reliability of the inversion results, leading to better subsurface exploration outcomes.
Conclusion¶
3D forward modeling of gravity and magnetic fields is a vital tool in modern geophysics, offering insights into subsurface structures even before expensive field surveys or computationally heavy inversion processes are undertaken. By serving as a foundation for planning, QA/QC, and interpretation, forward modeling provides a cost-effective, efficient way to improve the accuracy of subsurface models. When combined with apriori information, it further enhances the inversion process, helping to construct accurate, reliable models for use in resource exploration and other geophysical applications.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import Forward_Model as fm
import time
from tqdm import tqdm
import grav_mag_inv as gmi
1. Magnetic Anomaly for a small magnetic body at depth¶
# Parameters
L = 100 # Size of the 3D grid (meters)
N = 30 # Number of points in each dimension
cylinder_radius = 25 # Radius of the cylinder (meters)
cylinder_length = 30 # Length of the cylinder along the Z-axis (meters)
cylinder_center = np.array([L/2, L/2]) # Center of the cylinder in the X-Y plane
susceptibility_cylinder = 0.01 # SI
susceptibility_background = 0.0001 # SI
susceptibility, X, Y, Z = fm.create_3d_cylinder(cylinder_radius, cylinder_length, susceptibility_cylinder, susceptibility_background, L = L, N = N)
fig = fm.plot_3d_subsurface(susceptibility, X, Y, Z)
fig.show()
# Earth's magnetic field parameters
I = np.radians(-50) # Magnetic inclination in radians
D = np.radians(-3.2) # Magnetic declination in radians
B_0 = 31000 # Earth's magnetic field strength in nT (assumed)
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 1.20 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
2. Reduced to pole anomaly for a small magnetic body at depth¶
# Earth's magnetic field parameters
I = np.radians(90) # Magnetic inclination in radians
D = np.radians(0) # Magnetic declination in radians
B_0 = 31000 # Earth's magnetic field strength in nT (assumed)
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model(I, D, B_0, susceptibility, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 5.33 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
3. Magnetic anomlay for a dyke¶
# Parameters
L = 1000 # Size of the 3D grid (meters)
N = 20 # Number of points in each dimension
cylinder_radius = 100 # Radius of the cylinder (meters)
cylinder_length = 800 # Length of the cylinder along the Z-axis (meters)
cylinder_center = np.array([L/2, L/2]) # Center of the cylinder in the X-Y plane
susceptibility_cylinder = 0.06 # SI
susceptibility_background = 0.0001 # SI
susceptibility, X, Y, Z = fm.create_3d_cylinder(cylinder_radius, cylinder_length, susceptibility_cylinder, susceptibility_background, L = L, N = N)
susceptibility.shape
(20, 20, 20)
fig = fm.plot_3d_subsurface(susceptibility, X, Y, Z)
fig.show()
# Earth's magnetic field parameters
I = np.radians(-49) # Magnetic inclination in radians
D = np.radians(-3.2) # Magnetic declination in radians
B_0 = 31000 # Earth's magnetic field strength in nT (assumed)
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.24 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
4. Reduced to pole anomaly for a dyke¶
# Earth's magnetic field parameters
I = np.radians(90) # Magnetic inclination in radians
D = np.radians(0) # Magnetic declination in radians
B_0 = 31000 # Earth's magnetic field strength in nT (assumed)
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.21 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
5. Magnetic anomaly for a shallower dipping magnetic body¶
length = 800
width = 300
height = 100
center_x = 500
center_y = 500
depth_z = 250
susceptibility_cuboid = 0.05
susceptibility_background = 0.0004
susceptibility, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=45, tilt_angle=20, L=1000, N=20)
fig = gmi.plot_3d_subsurface(susceptibility, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.22 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
6. Dipping Magentic Bodies at larger depth¶
length = 600
width = 400
height = 100
center_x = 500
center_y = 500
depth_z = 550
susceptibility_cuboid = 0.05
susceptibility_background = 0.0004
susceptibility, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=45, tilt_angle=20, L=1000, N=20)
fig = gmi.plot_3d_subsurface(susceptibility, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.22 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
length = 800
width = 800
height = 100
center_x = 500
center_y = 500
depth_z = 750
susceptibility_cuboid = 0.05
susceptibility_background = 0.0004
susceptibility1, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=45, tilt_angle=0, L=1000, N=20)
fig = gmi.plot_3d_subsurface(susceptibility1, X, Y, Z)
fig.show()
# Parameters
L = 1000 # Size of the 3D grid (meters)
N = 20 # Number of points in each dimension
cylinder_radius = 50 # Radius of the cylinder (meters)
cylinder_length = 600 # Length of the cylinder along the Z-axis (meters)
cylinder_center = np.array([L/2, L/2]) # Center of the cylinder in the X-Y plane
susceptibility_cylinder = 0.01 # SI
susceptibility_background = 0.0001 # SI
susceptibility2, X, Y, Z = fm.create_3d_cylinder(cylinder_radius, cylinder_length, susceptibility_cylinder, susceptibility_background, L = L, N = N)
fig = gmi.plot_3d_subsurface(susceptibility2, X, Y, Z)
fig.show()
length = 100
width = 100
height = 600
center_x = 400
center_y = 700
depth_z = 350
susceptibility_cuboid = 0.01
susceptibility_background = 0.0004
susceptibility3, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=45, tilt_angle=0, L=1000, N=20)
susceptibility4 = susceptibility1 + susceptibility2 + susceptibility3
fig = gmi.plot_3d_subsurface(susceptibility4, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility4, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.26 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
length = 600
width = 600
height = 600
center_x = 400
center_y = 700
depth_z = 450
susceptibility_cuboid = 0.03
susceptibility_background = 0.0004
susceptibility5, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=45, tilt_angle=0, L=1000, N=20)
susceptibility6 = susceptibility1 + susceptibility2 + susceptibility3 + susceptibility5
fig = gmi.plot_3d_subsurface(susceptibility6, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility6, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.22 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
length = 800
width = 100
height = 600
center_x = 400
center_y = 400
depth_z = 450
susceptibility_cuboid = 0.03
susceptibility_background = 0.0004
susceptibility7, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=45, tilt_angle=30, L=1000, N=20)
fig = gmi.plot_3d_subsurface(susceptibility7, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility7, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.33 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
length = 100
width = 800
height = 600
center_x = 600
center_y = 200
depth_z = 450
susceptibility_cuboid = 0.03
susceptibility_background = 0.0004
susceptibility8, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=-5, tilt_angle=10, L=1000, N=20)
fig = gmi.plot_3d_subsurface(susceptibility8, X, Y, Z)
fig.show()
susceptibility9 = susceptibility7 + susceptibility8
fig = gmi.plot_3d_subsurface(susceptibility9, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility9, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.24 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
length = 100
width = 100
height = 200
center_x = 150
center_y = 300
depth_z = 200
susceptibility_cuboid = 0.06
susceptibility_background = 0.0004
susceptibility10, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=-15, tilt_angle=0, L=1000, N=20)
susceptibility11 = susceptibility9 + susceptibility10
fig = gmi.plot_3d_subsurface(susceptibility11, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility11, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.23 seconds
fm.plot_forward_model(delta_T_sim, X, Y)
length = 200
width = 800
height = 500
center_x = 600
center_y = 200
depth_z = 450
susceptibility_cuboid = 0.03
susceptibility_background = 0.0004
susceptibility12, X, Y, Z = fm.create_3d_cuboid_oriented(length, width, height, center_x, center_y, depth_z,
susceptibility_cuboid, susceptibility_background, azimuth_angle=-34, tilt_angle=40, L=1000, N=20)
#susceptibility12 = susceptibility9 + susceptibility10
fig = gmi.plot_3d_subsurface(susceptibility12, X, Y, Z)
fig.show()
start_time = time.time()
delta_T_sim = fm.create_3d_forward_model_Fast(I, D, B_0, susceptibility12, L, N)
elapsed_time = time.time() - start_time
print(f"Time taken: {elapsed_time:.2f} seconds")
Time taken: 0.22 seconds
fm.plot_forward_model(delta_T_sim, X, Y)